import time
from datetime import datetime
from config.Peizhi import Bdw
import requests

# 从配置文件中导入 Bdw 类并实例化，用于获取各功能的标准流量值等配置信息
bdw = Bdw()
# Django API地址，用于将故障信息推送到该 API
API_URL = "http://222.134.245.144:17000/weizhang/VioModel/"

# 原始数据（包含所有设备状态）
data = {
    "id": 1,
    "liu_liang_ji": "27.3625",
    "wan_neng_ya_li": "27.74375",
    "guan_hui_ya_li": "3000",
    "chu_neng_qi_ya_li": "3000",
    "zuan_ji_qi_ya": "3000",
    "wan_neng": {
        "hong_yali": True,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "shang_ya_jing": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "ke_bian_zha_ban": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "shang_zu_liu": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "xia_ya_jing": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "jian_qie_zha_ban": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "xia_zu_liu": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "shang_zha_ban": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "xia_zha_ban": {
        "hong_yali": False,
        "hong_deng": True,
        "lv_yali": False,
        "lv_deng": True
    },
    "updated": "2025-02-14T10:50:34.521938",
    "created": "2025-02-14T10:50:34.521938"
}

# 配置项
# 主流量计字段，用于获取主流量数据
main_flow_field = "liu_liang_ji"
# 定义需要检查的功能列表
functions = [
    "wan_neng", "shang_ya_jing", "ke_bian_zha_ban", "shang_zu_liu",
    "xia_ya_jing", "jian_qie_zha_ban", "xia_zu_liu", "shang_zha_ban", "xia_zha_ban"
]
# 各功能标准流量值（60秒累计），从配置文件中获取相应的值
standard_flow = {
    "wan_neng": bdw.wan_neng,
    "shang_ya_jing": bdw.shang_ya_jing,
    "ke_bian_zha_ban": bdw.ke_bian_zha_ban,
    "shang_zu_liu": bdw.shang_ya_jing,
    "xia_ya_jing": bdw.xia_ya_jing,
    "jian_qie_zha_ban": bdw.jian_qie_zha_ban,
    "xia_zu_liu": bdw.xia_zu_liu,
    "shang_zha_ban": bdw.shang_ya_jing,  # 假设此处应为bdw.shang_zha_ban，原代码可能存在配置错误
    "xia_zha_ban": bdw.xia_zha_ban
}

# 定义一个函数，用于检查所有功能的压力状态，返回有效状态信息
def check_status():
    """检查所有功能的压力状态，返回有效状态信息"""
    # 初始化有效状态的数量为 0
    true_count = 0
    # 初始化激活的功能为 None
    active_func = None
    # 初始化激活的压力类型为 None，用于记录是红压力还是绿压力
    active_type = None

    for func in functions:
        # 获取当前功能的状态，确保字典存在，避免 KeyError
        status = data.get(func, {})
        # 分别检查红压力和绿压力状态
        if status.get("hong_yali", False):
            # 如果红压力为 True，有效状态数量加 1
            true_count += 1
            # 记录激活的功能
            active_func = func
            # 记录激活的压力类型为红压力
            active_type = "hong_yali"
        if status.get("lv_yali", False):
            # 如果绿压力为 True，有效状态数量加 1
            true_count += 1
            # 记录激活的功能
            active_func = func
            # 记录激活的压力类型为绿压力
            active_type = "lv_yali"
    # 返回有效状态的数量、激活的功能和激活的压力类型
    return true_count, active_func, active_type

# 定义一个函数，用于将故障信息推送到 REST API，兼容 Django 的 DateTime 格式和字段要求
def send_fault_to_api(fault_info):
    """推送故障信息到REST API，兼容Django的DateTime格式和字段要求"""
    try:
        # 处理时间格式，确保符合 Django 的 ISO 8601 格式
        fault_info["gu_zhang_shi_jian"] = datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
        # 发送 POST 请求，将故障信息以 JSON 格式发送到指定的 API 地址
        response = requests.post(API_URL, json=fault_info)

        if response.status_code == 201:
            # 如果请求成功（状态码为 201），打印成功推送的信息，包含故障 ID
            print(f"✅ 故障推送成功，ID：{response.json().get('id', '未知')}")
        else:
            # 如果请求失败，打印失败信息，包含状态码和错误信息
            print(f"❌ 推送失败，状态码：{response.status_code}，错误：{response.json()}")
    except requests.exceptions.RequestException as e:
        # 如果请求过程中出现异常，打印异常信息
        print(f"🚫 网络请求失败：{str(e)}")

# 定义一个函数，用于主监测流程：状态检查+流量累计+结果判定
def monitor_process():
    """主监测流程：状态检查+流量累计+结果判定"""
    # 初始状态检查，调用定义好的 check_status 函数
    initial_true, _, _ = check_status()
    if initial_true != 1:
        # 如果初始状态下有效状态的数量不为 1，打印异常信息并返回
        print(f"监测初始状态异常，已有{initial_true}个压力状态为True")
        return

    # 打印开始 5 秒监测周期的信息
    print("开始5秒监测周期...")
    # 记录开始时间
    start_time = time.time()
    # 初始化累计主流量为 0
    total_flow = 0.0
    # 初始化激活的状态信息为 None
    active_status = None

    while time.time() - start_time < 5:
        # 获取当前的有效状态数量、激活的功能和激活的压力类型
        current_true, func, typ = check_status()
        # 获取当前主流量，并转换为浮点数类型
        current_flow = float(data[main_flow_field])

        # 状态变化处理
        if current_true == 1:
            if not active_status:
                # 如果首次检测到单状态激活，记录激活的状态信息
                active_status = (func, typ)
            # 累计流量
            total_flow += 1
        # 每秒监测一次
        time.sleep(1)

    # 5 秒后结果判定
    if active_status:
        # 解包激活的状态信息
        func, typ = active_status
        # 获取当前功能的标准流量值
        std = standard_flow.get(func, 0)
        if total_flow < std:
            # 如果累计流量小于标准流量值，打印动作不到位的信息
            print(f"❌ {func} 的{typ}动作不到位：累计流量{total_flow:.2f} < 标准{std}")
            # 构造故障信息
            fault_info = {
                "gu_zhang_ming_cheng": f"{func} {typ}动作不到位",
                "she_bei_ming_cheng": func,
                "she_bei_qu_yu": "阀门组",  # 根据实际设备区域调整
                "gu_zhang_lei_xing": "流量异常",
                "shi_ji_zhi": round(total_flow, 2),
                "gao_jing_zhi": std,
                "gu_zhang_miao_shu": f"{func}的{typ}动作在5秒内累计流量{total_flow:.2f}小于标准值{std}",
                "chu_li_zhuang_tai": "未处理"
            }
            # 调用 send_fault_to_api 函数推送故障信息
            send_fault_to_api(fault_info)
        else:
            # 如果累计流量大于等于标准流量值，打印正常的信息
            print(f"✅ {func} 的{typ}正常：累计流量{total_flow:.2f} ≥ 标准{std}")
    else:
        # 如果 5 秒内无有效压力状态激活，打印相应信息
        print("🚫 5秒内无有效压力状态激活（所有状态均为False）")

# 程序入口，调用 monitor_process 函数进行主监测流程
if __name__ == "__main__":
    monitor_process()